package solutions.ferpa.ztest.intf;

import br.com.telescope.adsrt.dom.DomId;
import br.com.telescope.adsrt.dom.DomSelectionCheck;
import br.com.telescope.adsrt.dom.DomText;
import br.com.telescope.adsrt.dom.DomTextLong;
import br.com.telescope.adsrt.dom.DomUpper;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.t2.ModuleNavigator;
import br.com.telescope.t2.ServiceModel;
import br.com.telescope.t2.exception.ApplicationRuntimeException;
import br.com.telescope.t2.feature.CustomActionFeature;
import br.com.telescope.t2.feature.DeleteFeature;
import br.com.telescope.t2.feature.ExportFeature;
import br.com.telescope.t2.feature.ImportFeature;
import br.com.telescope.t2.feature.InsertFeature;
import br.com.telescope.t2.feature.ListFeature;
import br.com.telescope.t2.feature.QueryFeature;
import br.com.telescope.t2.feature.SearchFeature;
import br.com.telescope.t2.feature.UpdateFeature;
import br.com.telescope.util.JdbcUtil;
import java.util.List;
import solutions.ferpa.ztest.ent.*;

/**
 * Funções de usuários.
 * <p>
 * Tela de cadastramento das funções que podem ser exercidas por um 
 * usuário. Também pode ser chamada de PAPEIS, ROLES, PERFIS, etc.
 * <P>
 * Telescope origin: RTSYSINF.CAD_FUNCAO
 * <P>
 * Base entity: RTSYSINF.FUNCOES_SISTEMAS
 * <P>
 * @author TELESCOPE - Build task T2 Web Interface Generator
 * <P>
 * @version 0.1
 */
public class CadFuncao extends ServiceModel {
    
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    public static final String GLOBAL_NAME = "RTSYSINF.CAD_FUNCAO";
    
    @Override
    public String globalName() {
        return GLOBAL_NAME;
    }
    
    {
        setTitle("Funções de usuários");
    }
    
    protected EntFuncoesSistemas func;
    protected EntFuncoesSistemas rec; // NEED_TJW1_COMPATIBILITY
    
    // Record items
    private DomId aId;
    private DomUpper aFuncaoSistema;
    private DomText aTitulo;
    private DomTextLong aDescricao;
    private DomSelectionCheck aUnUsuarios;
    private DomTextLong aOperacoes;
    
    // Query items
    private DomTextLong qDescricao;
    private DomText qTitulo;
    private DomUpper qFuncaoSistema;
    
    @Override
    public String getBaseSql() {
        return "select FUNC.*"
                + " from FUNCOES_SISTEMAS FUNC";
    }
    
    @Override
    public void initAttributes() {
        
        aId = new DomId();
        aId.context(ctx).name("ID").label("Id");
        
        aFuncaoSistema = new DomUpper();
        aFuncaoSistema.context(ctx).name("FUNCAO_SISTEMA").label("Função");
        
        aTitulo = new DomText();
        aTitulo.context(ctx).name("TITULO").label("Título");
        
        aDescricao = new DomTextLong();
        aDescricao.context(ctx).name("DESCRICAO").label("Descrição");
        
        aUnUsuarios = new DomSelectionCheck();
        aUnUsuarios.context(ctx).name("UN_USUARIOS").label("Usuários").unbound(true);
        
        aUnUsuarios.setSqlOptions("select id, login from usuarios where ativo = 'S' order by login");
        
        aOperacoes = new DomTextLong();
        aOperacoes.context(ctx).name("OPERACOES").label("Operacões").unbound(true);
        
        
        qDescricao = new DomTextLong();
        qDescricao.context(ctx).name("DESCRICAO").label("Descrição");
        
        qTitulo = new DomText();
        qTitulo.context(ctx).name("TITULO").label("Título");
        
        qFuncaoSistema = new DomUpper();
        qFuncaoSistema.context(ctx).name("FUNCAO_SISTEMA").label("Função");
    }
    
    @Override
    public String getQueryPkColumn() {
        return "FUNC.ID";
    }
    
    @Override
    public void setId(String value) {
        this.aId.setValue(value);
    }
    
    @Override
    public EntFuncoesSistemas getRecord() {
        if (func == null) {
            func = new EntFuncoesSistemas(ctx);
            rec = func;
        }
        return this.func;
    }
    
    @Override
    public String getContextName() {
        return aFuncaoSistema.toText();
    }
    
    @Override
    public String getDefaultOrderBy() {
        return "FUNCAO_SISTEMA, TITULO, DESCRICAO";
    }
    
    @Override
    public ModuleNavigator getDefaultModuleNavigator() {
        return new ModFuncoes();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="QUERY">
    public class FQuery extends QueryFeature {
        
        @Override
        public void initForm() {
            addField(qFuncaoSistema, "opt");
            addField(qTitulo, "opt");
            addField(qDescricao, "opt");
        }
        
        {
            setFeatureName("QUERY");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="LIST">
    public class FList extends ListFeature {
        
        @Override
        public void initForm() {
            aFuncaoSistema.setWidth(20);
            addField(aFuncaoSistema, "view");
            aTitulo.setWidth(30);
            addField(aTitulo, "view");
            aUnUsuarios.setWidth(30);
            addField(aUnUsuarios, "view");
            aDescricao.setWidth(30);
            addField(aDescricao, "view");
        }
        
        @Override
        public void preRecord() {
            try {
                popularUsuarios();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("LIST");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="INSERT">
    public class FInsert extends InsertFeature {
        
        @Override
        public void initForm() {
            aFuncaoSistema.setOptional(false);
            addField(aFuncaoSistema, "rqd");
            aTitulo.setOptional(false);
            addField(aTitulo, "rqd");
            addField(aUnUsuarios, "opt");
            addField(aDescricao, "opt");
            addField(aOperacoes, "opt");
        }
        
        @Override
        public void posInsert() {
            try {
                salvarOperacoes();
                salvarUsuarios();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("INSERT");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="UPDATE">
    public class FUpdate extends UpdateFeature {
        
        @Override
        public void initForm() {
            aFuncaoSistema.setOptional(false);
            addField(aFuncaoSistema, "rqd");
            aTitulo.setOptional(false);
            addField(aTitulo, "rqd");
            addField(aUnUsuarios, "opt");
            addField(aDescricao, "opt");
            addField(aOperacoes, "opt");
        }
        
        @Override
        public void preDisplay() {
            try {
                popularUsuarios();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        @Override
        public void onAction() {
            addSubmit(getFeature("CLONAR")).label("Clone");
        }
        
        @Override
        public void posUpdate() {
            try {
                salvarOperacoes();
                salvarUsuarios();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        @Override
        public void preRecord() {
            try {
                popularOperacoes();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("UPDATE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="DELETE">
    public class FDelete extends DeleteFeature {
        
        @Override
        public void initForm() {
            addField(aFuncaoSistema, "view");
        }
        
        {
            setFeatureName("DELETE");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="CLONAR">
    public class FClonar extends CustomActionFeature {
        
        @Override
        public void initForm() {
        }
        
        @Override
        public void execute() {
            try {
                clonar();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("CLONAR");
            setTitle("Clone");
            setActionTitle("Clonar");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="SEARCH">
    public class FSearch extends SearchFeature {
        
        @Override
        public void initForm() {
            addField(qFuncaoSistema, "search");
            addField(qTitulo, "search");
            addField(qDescricao, "search");
        }
        
        {
            setFeatureName("SEARCH");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="IMPORT">
    public class FImport extends ImportFeature {
        
        @Override
        public void initForm() {
            addField(aId, "opt");
            addField(aFuncaoSistema, "key");
            aTitulo.setOptional(false);
            addField(aTitulo, "rqd");
            addField(aDescricao, "opt");
            addField(aOperacoes, "opt");
        }
        
        @Override
        public void posInsert() {
            try {
                salvarOperacoes();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("IMPORT");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="EXPORT">
    public class FExport extends ExportFeature {
        
        @Override
        public void initForm() {
            addField(aId, "view");
            addField(aFuncaoSistema, "view");
            addField(aTitulo, "view");
            addField(aDescricao, "view");
            addField(aOperacoes, "view");
        }
        
        @Override
        public void preRecord() {
            try {
                popularOperacoes();
            } catch (AdsException ex) {
                throw new ApplicationRuntimeException(ex);
            }
        }
        
        {
            setFeatureName("EXPORT");
            setPrimary(false);
        }
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="initFeatures">
    
    @Override
    protected void initFeatures() {
        addFeature(new FQuery());
        addFeature(new FList());
        addFeature(new FInsert());
        addFeature(new FUpdate());
        addFeature(new FDelete());
        addFeature(new FClonar());
        addFeature(new FSearch());
        addFeature(new FImport());
        addFeature(new FExport());
        super.initFeatures();
    }
    
    @Override
    public String getDefaultFeature() {
        return "QUERY";
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Getters and Setters">
    
    @Override
    public Long getId() {
        return aId.getValue();
    }
    
    public void setId(Long value) {
        this.aId.setValue(value);
    }
    
    public String getFuncaoSistema() {
        return aFuncaoSistema.getValue();
    }
    
    public void setFuncaoSistema(String value) {
        this.aFuncaoSistema.setValue(value);
    }
    
    public String getTitulo() {
        return aTitulo.getValue();
    }
    
    public void setTitulo(String value) {
        this.aTitulo.setValue(value);
    }
    
    public String getDescricao() {
        return aDescricao.getValue();
    }
    
    public void setDescricao(String value) {
        this.aDescricao.setValue(value);
    }
    
    public String getUnUsuarios() {
        return aUnUsuarios.getValue();
    }
    
    public void setUnUsuarios(String value) {
        this.aUnUsuarios.setValue(value);
    }
    
    public String getOperacoes() {
        return aOperacoes.getValue();
    }
    
    public void setOperacoes(String value) {
        this.aOperacoes.setValue(value);
    }
    public String getQueryFuncaoSistema() {
        return qFuncaoSistema.getQueryValue();
    }
    
    public void setQueryFuncaoSistema(String value) {
        this.qFuncaoSistema.setQueryValue(value);
    }
    public String getQueryTitulo() {
        return qTitulo.getQueryValue();
    }
    
    public void setQueryTitulo(String value) {
        this.qTitulo.setQueryValue(value);
    }
    public String getQueryDescricao() {
        return qDescricao.getQueryValue();
    }
    
    public void setQueryDescricao(String value) {
        this.qDescricao.setQueryValue(value);
    }
    // </editor-fold>
    
    /**
     * Popular as operações.
     * <p>
     * Popula o campo de operações com a lista de operações que a função dá 
     * acesso.
     */
    public void popularOperacoes() throws AdsException {
        // <user-code id="19434555" parentId="19434470" hashcode="-556b9705" length="487">
        // import br.com.telescope.util.JdbcUtil;
        List<String> operacoes = JdbcUtil.getList(String.class, "select s.operacao"
                + " from operacoes_funcoes o"
                + " join operacoes_sistemas s on s.id = o.operacao_id"
                + " where o.funcao_id = ?"
                + " order by s.operacao", getRecord().valueOfId());
        StringBuilder text = new StringBuilder(1000);
        for (String operacao : operacoes) {
            text.append(operacao).append("\n");
        }
        aOperacoes.setValue(text.toString());
        
        // </user-code>
    }
    
    /**
     * Salvar operacoes.
     * <p>
     * Salva as operações da função.
     */
    public void salvarOperacoes() throws AdsException {
        // <user-code id="19434548" parentId="19434497" hashcode="-3f7323ab" length="790">
        if (aOperacoes.isNotNull()) {
            EntOperacoesFuncoes operacoesFuncoes = new EntOperacoesFuncoes(ctx);
            EntOperacoesFuncoes delOperacoesFuncoes = rec.findAllOperacoesFuncoesFuncao();
            while (delOperacoesFuncoes.next()) {
                delOperacoesFuncoes.del();
            }
            EntOperacoesSistemas ops = new EntOperacoesSistemas(ctx);
            String[] operacoes = aOperacoes.getValue().split("\n");
            for (String operacao : operacoes) {
                operacao = operacao.trim().toUpperCase();
                if (!operacao.isEmpty()) {
                    ops.findByOperacao(operacao);
                    operacoesFuncoes.nullify();
                    operacoesFuncoes.setFuncaoId(rec.valueOfId());
                    operacoesFuncoes.setOperacaoId(ops.valueOfId());
                    operacoesFuncoes.ins();
                }
            }
        }
        
        // </user-code>
    }
    
    /**
     * Clone.
     * <p>
     * Permite duplicar um perfil de acesso. Normalmente utilizado para 
     * facilitar o cadastramento de um perfil de acesso semelhante a um 
     * outro.
     */
    public void clonar() throws AdsException {
        // <user-code id="3464794" parentId="3464793" hashcode="-8e6c5be" length="130">
        ctx.readFields(aId);
        getRecord().findById(aId);
        EntFuncoesSistemas clone = getRecord().clonar();
        doUpdate(clone.valueOfId());
        
        // </user-code>
    }
    
    /**
     * Popular usuários.
     * <p>
     * Popula usuário na tela de update
     */
    private void popularUsuarios() throws AdsException {
        // <user-code id="2003806" parentId="2003802" hashcode="-1430ea4d" length="584">
        if (ctx.getPreference(globalName("INFORMAR_USUARIOS"), "S").equals("S")) {
            aUnUsuarios.setSqlOptions("select id, login from usuarios where ativo = 'S' order by login");
            aUnUsuarios.populateOptions();
            
            EntFuncoesUsuarios funcoesUsuarios = rec.findAllFuncoesUsuariosFuncao();
            StringBuilder out = new StringBuilder(100);
        
            while (funcoesUsuarios.next()) {
                if (out.length() > 0) out.append(",");
                out.append(funcoesUsuarios.valueOfUsuarioId());
            }
            aUnUsuarios.setValue(out.toString());
        } else {
            aUnUsuarios.setHidden(true);
        }
        // </user-code>
    }
    
    /**
     * Salvar usuários.
     * <p>
     * Salva usuários que serão vinculados a esta função
     */
    private void salvarUsuarios() throws AdsException {
        // <user-code id="2003811" parentId="2003808" hashcode="47449af" length="576">
        if (ctx.getPreference(globalName("INFORMAR_USUARIOS"), "S").equals("S")) {
            EntFuncoesUsuarios funcoesUsuarios = new EntFuncoesUsuarios(ctx);
        	EntFuncoesUsuarios delFuncoesUsuarios = rec.findAllFuncoesUsuariosFuncao();
        	while (delFuncoesUsuarios.next()) delFuncoesUsuarios.del();
        	if (aUnUsuarios.isNotNull()) {
        		String[] usuarios = aUnUsuarios.getValue().split(",");
        		for (String usuario : usuarios) {
        			funcoesUsuarios.nullify();
        			funcoesUsuarios.setFuncaoId(rec.valueOfId());
        			funcoesUsuarios.setUsuarioId(usuario);
        			funcoesUsuarios.ins();
        		}
        	}
        }
        // </user-code>
    }
    
    @Override
    public String getJsServiceFile() {
        return "ui/rtsysinf/cad_funcao.js";
    }
}
